package com.lrs.java.jdbc.jdbc_exercise;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * 上一个例子使用批处理，此例主要研究批处理中的Transaction
 * @author Administrator
 *
 */
public class TestTransaction {
	
	public static void main(String[] args) {
		Connection conn = null; 
		Statement stmt = null;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		try {
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ZLPD", "scott", "tiger");
			stmt = conn.createStatement();
			//让自动提交为false
			conn.setAutoCommit(false);
			//让第二条语句出现异常。
			stmt.addBatch("insert into dept2 values(50, 'game', 'bj')");
			stmt.addBatch("insert into dept2 values(51aaa, 'game', 'bj')");
			stmt.addBatch("insert into dept2 values(52, 'game', 'bj')");
			
			stmt.executeBatch();
			
			//显示调用commit方法，如果批处理过程没有出现错误，则提交。
			conn.commit();
			
			System.out.println("success!");
			
		} catch (SQLException e) {
			//如果在批处理过程出现异常，则回滚（rollback)。
			//如果此处不会滚，若如上所示，第二条语句出现错误，则第一条语句已经插入到数据库中。
			try {
				conn.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
			
			e.printStackTrace();
		} finally {
			try {
				if(stmt != null) {
					stmt.close();
					stmt = null;
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if(conn != null) {
					conn.close();
					conn = null;
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		
	}
}